<html>
    <head>
        <title>覆盖存储库</title>
    </head>
    <body>
        <script>
            /*
                    四、覆盖存储库

                                                public class MyEfCoreIdentityUserRepository : EfCoreIdentityUserRepository
                                                {
                                                    public MyEfCoreIdentityUserRepository(
                                                        IDbContextProvider<IIdentityDbContext> dbContextProvider)
                                                        : base(dbContextProvider)
                                                    {
                                                    }

                                                    // 你可在此处充写任何方法
                                                }     
                                                    
                                                
                                    在此示例中，我们覆盖了由Identity模块定义的EfCoreIdentityUserRepository类。这是用户存储库的Entity Framework Core实现。

                                    由于命名约定（MyEfCoreIdentityUserRepository以EfCoreIdentityUserRepository结尾），不需要额外的设置。

                                    你可以覆盖任何基本方法来根据你的需要对其进行自定义。

                                    但是，如果你注入IRepository<IdentityUser>或IRepository<IdentityUser, Guid>，它仍将使用默认存储库实现。

                                    要替换默认存储库实现，请在模块类的ConfigureServices方法中编写以下代码：
                                     
                                                context.Services.AddDefaultRepository(
                                                    typeof(Volo.Abp.Identity.IdentityUser),
                                                    typeof(MyEfCoreIdentityUserRepository),
                                                    replaceExisting: true
                                                );

                                    通过这种方式，如果你注入IRepository<IdentityUser>、IRepository<IdentityUser, Guid>或IIdentityUserRepository，你的实现将被使用。

                                    如果你想向存储库添加"额外的"方法并在你自己的代码中使用它，你可以定义一个接口并从你的存储库实现中公开它。你还可以扩展预构建的存储库接口。
                                    
                                    例子：

                                                public interface IMyIdentityUserRepository : IIdentityUserRepository
                                                {
                                                    public Task DeleteByEmailAddress(string email);
                                                }

                                    IMyIdentityUserRepository接口扩展了Identity模块的IIdentityUserRepository接口。然后你可以实现它，如以下示例所示：

                                                [ExposeServices(typeof(IMyIdentityUserRepository), IncludeDefaults = true)]
                                                public class MyEfCoreIdentityUserRepository
                                                    : EfCoreIdentityUserRepository, IMyIdentityUserRepository
                                                {
                                                    public MyEfCoreIdentityUserRepository(
                                                        IDbContextProvider<IIdentityDbContext> dbContextProvider)
                                                        : base(dbContextProvider)
                                                    {
                                                    }

                                                    public async Task DeleteByEmailAddress(string email)
                                                    {
                                                        var dbContext = await GetDbContextAsync();
                                                        var user = await dbContext.Users.FirstOrDefaultAsync(u => u.Email == email);
                                                        if (user != null)
                                                        {
                                                            dbContext.Users.Remove(user);
                                                        }
                                                    }
                                                }
                                                
                                                MyEfCoreIdentityUserRepository类实现了IMyIdentityUserRepository接口。

                                                ExposeServices属性是必需的，因为ABP不能通过命名约定公开IMyIdentityUserRepository（MyEfCoreIdentityUserRepository不以MyIdentityUserRepository结尾）

                                                现在，你可以将IMyIdentityUserRepository接口注入服务并调用其DeleteByEmailAddress方法。

                */
        </script>
    </body>
</html>